package cz.vse.adventura.po1715.xforv00_forejt.gui._04_abstract;

import cz.pecinovsky.english.pojj.adv_framework.game_gui.Commands;
import cz.pecinovsky.english.pojj.adv_framework.game_gui.IGameG;
import cz.pecinovsky.english.pojj.adv_framework.game_gui.IObjectG;
import cz.pecinovsky.english.pojj.adv_framework.game_txt.INamed;
import cz.pecinovsky.english.pojj.adv_framework.gui_stage.IGUI_03;
import cz.pecinovsky.english.pojj.adv_framework.gui_stage.IGUI_03_Pane;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Collection;
import javax.swing.Box;
import javax.swing.JLabel;
import javax.swing.JScrollPane;


/*******************************************************************************
 * Instance třídy {@code AContainerClass} představují společného rodiče
 * kontejnerů ObjectPane, NeighborPane, BagPane
 *
 * @author    Vladimír FOREJT
 * @version   0.00.000
 */
abstract class AContainerClass<Element extends INamed>
        extends Box
        implements IGUI_03_Pane
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    /** Posluchač události stisku tlačítka v panelu. */
    private final ActionListener listener = new ButtonListener();

    /** GUI, které bude tento panel používat */
    private final IGUI_03 gui;

    private final Dimension distance;

    /** Návěští v panelu sousedů specifikující obsah daného panelu. */
    private final JLabel title;

    /** Typ příkazu realizujcícího změny v daném panelu. */
    private final Commands.Type typeOfCommand;


//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================

    /** Aktuálně provozovaná hra */
    private IGameG game;

    /** Název příkazu realizujcícího změny v daném panelu. */
    private String command;
    
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     *
     */
    AContainerClass(IGUI_03 gui, int axis, String title,
            Dimension distance, Commands.Type typeOfCommand)
    {
     super(axis);
     this.gui = gui;
     this.distance = distance;
     this.title = new JLabel(title);
     this.typeOfCommand  = typeOfCommand;
    }



//== ABSTRAKTNÍ METODY =========================================================

    /***************************************************************************
     * Vrátí kolekci s prvky, které se mají zobrazit v panelu.
     *
     * @return Kolekce s prvky, které se mají zobrazit v panelu
     */
//    @Override
    abstract Collection<? extends Element> getCollection();

//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================

    /***************************************************************************
     * Vrátí GUI, kterým je daný panel používán
     *
     * @return GUI, kterým je daný panel používán
     */
    public IGUI_03 getGui()
    {
        return gui;
    }


    /***************************************************************************
     * Vrátí nastavenou hru.
     *
     * @return Nastavená hra
     */
    public IGameG getGame()
    {
        return game;
    }

//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Inicializuje oblast zobrazující elementy na panelu
     */
    public void initialize() {
        removeAll();
        add(title);
        game = gui.getGame();
        command = game.getBasicCommands().getCommandName(typeOfCommand);
    }

    /***************************************************************************
     * Aktualizuje oblast zobrazující elementy na panelu
     */
     public void update() {
            initialize();

            Collection<? extends Element> elements = getCollection();
            for(Element element:elements) {
                this.add(Box.createRigidArea(distance));
                /*String elementName = element.getName();
                Icon picture = null;*/
                PaneItem button;
                if(element instanceof IObjectG) {
                    IObjectG object = (IObjectG) element;
                    button = new PaneItem(object);
                } else {
                    button = new PaneItem(element);
                }
                /*JButton button = new JButton(elementName, picture);*/
                button.addActionListener(listener);                
                this.add(button);
                
            }
     }

//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================

     /***************************************************************************
     * Posluchač reagující na stisk tlačítka tím,
     * že vyvolá příkaz s názvem tlačítka jako jeho parametrem.
     */
    private class ButtonListener implements ActionListener
    {
        /***********************************************************************
         * Zadá příkaz, jehož parametrem bude nápis na tlačítku.
         *
         * @param event Ohlášená událost, od níž zjistíme nápis na tlačítku
         */
        @Override
        public void actionPerformed(ActionEvent event)
        {
            //String argument = event.getActionCommand();
            PaneItem button = (PaneItem) event.getSource();
            String argument = button.getName();
            gui.executeCommand(command + " " + argument);
        }

    }

//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        AContainerClass inst = new AContainerClass();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}
